// https : // iai.sh.cn/problem/415
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int len = 0;
int a[20];
LL backup[20][2];
// backup[20][0]：长为i位数字时首位不为1 的平安数
// backup[20][1]：长为i位数字时首位为1 的平安数

// 当前的深度，当前的数值， 当前是否到达边界
LL dfs(int depth, int now, bool border) {

  if (depth > len)
    return 1;

  if (backup[depth][now == 1] != -1 && !border)
    return backup[depth][now == 1];

  LL res = 0;
  // 最大能达到多少
  int mx = border ? a[depth] : 9;
  for (int son = 0; son <= mx; son++) {
    if (now == 1 && son == 3)
      continue;
    // 搜下一层，  now 是谁 ， 是否是边界，不是边界可以0.。。。9
    res += dfs(depth + 1, son, border && son == mx);
  }
  if (!border) {
    backup[depth][now == 1] = res;
  }
  return res;
}

int main() {
  string s;
  cin >> s;
  len = s.size();
  for (int i = 0; i < len; i++) {
    a[i + 1] = s[i] - '0';
  }

  memset(backup, -1, sizeof(backup));
  cout << dfs(0, 0, true) - 1;
  return 0;
}